package org.opencv.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.util.Log;

/**
 * Basic implementation of LoaderCallbackInterface.
 */
public abstract class BaseLoaderCallback implements LoaderCallbackInterface {

	public BaseLoaderCallback(Context AppContext) {
		mAppContext = AppContext;
	}

	public void onManagerConnected(int status) {
		switch (status) {
		/** OpenCV initialization was successful. **/
		case LoaderCallbackInterface.SUCCESS: {
			/**
			 * Application must override this method to handle successful
			 * library initialization.
			 **/
		}
			break;
		/** OpenCV loader can not start Google Play Market. **/
		case LoaderCallbackInterface.MARKET_ERROR: {
			Log.e(TAG, "Package installation failed!");
			AlertDialog MarketErrorMessage = new AlertDialog.Builder(mAppContext).create();
			MarketErrorMessage.setTitle("OpenCV Manager");
			MarketErrorMessage.setMessage("Package installation failed!");
			MarketErrorMessage.setCancelable(false); // This blocks the 'BACK'
														// button
			MarketErrorMessage.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finish();
				}
			});
			MarketErrorMessage.show();
		}
			break;
		/** Package installation has been canceled. **/
		case LoaderCallbackInterface.INSTALL_CANCELED: {
			Log.d(TAG, "OpenCV library instalation was canceled by user");
			finish();
		}
			break;
		/**
		 * Application is incompatible with this version of OpenCV Manager.
		 * Possibly, a service update is required.
		 **/
		case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION: {
			Log.d(TAG, "OpenCV Manager Service is uncompatible with this app!");
			AlertDialog IncomatibilityMessage = new AlertDialog.Builder(mAppContext).create();
			IncomatibilityMessage.setTitle("OpenCV Manager");
			IncomatibilityMessage.setMessage(
					"OpenCV Manager service is incompatible with this app. Try to update it via Google Play.");
			IncomatibilityMessage.setCancelable(false); // This blocks the
														// 'BACK' button
			IncomatibilityMessage.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					finish();
				}
			});
			IncomatibilityMessage.show();
		}
			break;
		/** Other status, i.e. INIT_FAILED. **/
		default: {
			Log.e(TAG, "OpenCV loading failed!");
			AlertDialog InitFailedDialog = new AlertDialog.Builder(mAppContext).create();
			InitFailedDialog.setTitle("OpenCV error");
			InitFailedDialog.setMessage("OpenCV was not initialised correctly. Application will be shut down");
			InitFailedDialog.setCancelable(false); // This blocks the 'BACK'
													// button
			InitFailedDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() {

				public void onClick(DialogInterface dialog, int which) {
					finish();
				}
			});

			InitFailedDialog.show();
		}
			break;
		}
	}

	public void onPackageInstall(final int operation, final InstallCallbackInterface callback) {
		switch (operation) {
		case InstallCallbackInterface.NEW_INSTALLATION: {
			AlertDialog InstallMessage = new AlertDialog.Builder(mAppContext).create();
			InstallMessage.setTitle("Package not found");
			InstallMessage.setMessage(callback.getPackageName() + " package was not found! Try to install it?");
			InstallMessage.setCancelable(false); // This blocks the 'BACK'
													// button
			InstallMessage.setButton(AlertDialog.BUTTON_POSITIVE, "Yes", new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					callback.install();
				}
			});

			InstallMessage.setButton(AlertDialog.BUTTON_NEGATIVE, "No", new OnClickListener() {

				public void onClick(DialogInterface dialog, int which) {
					callback.cancel();
				}
			});

			InstallMessage.show();
		}
			break;
		case InstallCallbackInterface.INSTALLATION_PROGRESS: {
			AlertDialog WaitMessage = new AlertDialog.Builder(mAppContext).create();
			WaitMessage.setTitle("OpenCV is not ready");
			WaitMessage.setMessage("Installation is in progress. Wait or exit?");
			WaitMessage.setCancelable(false); // This blocks the 'BACK' button
			WaitMessage.setButton(AlertDialog.BUTTON_POSITIVE, "Wait", new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					callback.wait_install();
				}
			});
			WaitMessage.setButton(AlertDialog.BUTTON_NEGATIVE, "Exit", new OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					callback.cancel();
				}
			});

			WaitMessage.show();
		}
			break;
		}
	}

	void finish() {
		((Activity) mAppContext).finish();
	}

	protected Context mAppContext;
	private final static String TAG = "OpenCVLoader/BaseLoaderCallback";
}
